package com.zbj.homemade.spring.aop;

import com.zbj.homemade.spring.aop.interceptor.MethodInterceptor;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * |                    .  ’   *   ‘  .
 * |               _6                    "     o0000o
 * |  o00o _    .%                         %. o0000000o
 * | o000000o.:                              :(0000000o
 * | o00000os                                  .000000o
 * |  o0000/     <b>不了不了,改需求真的伤身体</>   .000o
 * |    o0o                                       .0o
 * |     y        <b>我认为源代码,就是SkrSkr</>     .
 * |    y                                           ,
 * |   y          <b>小熊猫保佑,代码永不修改</>        ,
 * |   p                            .                 .
 * |   p                           @@.                .
 * |    y                        ;@@@;               .
 * |    \                       ;@@@@;.@.          ,;S
 * |     、                     .@@@@@@;       ,@@@@@
 * |     @\.            .****...*@@@@;     .@@@@@@@@@@@.
 * |    @@@@\.     . @@@@@@@@@@@@@@@;    .@@@@@@@@@@@@@@@.
 * |   @@@@@@@@@.@@@@@@@@@@@@@@@@;   .@@@@@@@@@@@@@@@@@@@@@.
 * |  @@@@@@..@@@@..@@@@@@..@@@@@ .@@...@@@@@..@@..@@@@@..@@.
 * | @@@@@@@@..@..@@@@@@@@@@@@@;.@@@..@..@@@..@@....@@@..@@@@.
 * |@y@@@@@@@@..@@@@@@@@..@@@@i@@@@..@@@..@..@@..@@..@..@@@@n@.
 * |@n@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@...@@..@@@@...@@@@@n@@.
 * |@@@@@@@@..@@@@@@@@..@@@@@@@@@..@@@@@@@.@@..@@@@@..@@@@@@@@@@.
 * |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.
 *
 * @program: principle
 * @description:
 * @author: Yinn
 * @create: 2019-03-06 16:41
 **/
public class AspectCheck {

    /**
     * 程序共用一套切点,逐个校验,切点集合
     */
    private static final List<IPointCut> pointCuts = new ArrayList<>();

    /**
     * 拦截链集合
     */
    private static final Map<IPointCut, List<MethodInterceptor>> interceptors = new HashMap<>();

    /**
     * 当前方法是否被切到
     */
    public static boolean isCut(Method method){

        boolean flag = false;

        if (pointCuts.size() == 0)
            return flag;


        for (IPointCut pointCut : pointCuts){
            if (pointCut.isMatch(method)){
                flag = true;
                break;
            }
        }

        return flag;
    }

    public static List<IPointCut> getPointCuts(Method method){
        List<IPointCut> pointCuts = new ArrayList<>();

        for (IPointCut pointCut : pointCuts){
            if (pointCut.isMatch(method)){
                pointCuts.add(pointCut);
            }
        }

        return pointCuts;
    }

    public static List<MethodInterceptor> getChain(Method method){

        List<IPointCut> pointCuts = getPointCuts(method);

        if (pointCuts == null || pointCuts.size() < 1)
            return null;

        List<MethodInterceptor> result = new ArrayList<>();

        for (IPointCut iPointCut:pointCuts){
            List<MethodInterceptor> interceptorList = interceptors.get(iPointCut);

            if (interceptorList != null && interceptorList.size() < 1)
                continue;

            result.addAll(interceptorList);
        }

        //对拦截链结果集排序
        result.sort(new Comparator<MethodInterceptor>() {
            @Override
            public int compare(MethodInterceptor o1, MethodInterceptor o2) {
                int t1 = o1.getAdviceType();
                int t2 = o2.getAdviceType();
                if (t1 > t2)
                    return 1;
                else if (t1 == t2)
                    return 0;
                else
                    return -1;
            }
        });

        return result;
    }
}
